<!DOCTYPE html>
<html>

<head>
	<meta charset="UTF-8">
	<title></title>
</head>

<body style="padding-bottom:200px;">
</body>
<script type="text/javascript">
	// 一. 变量提升，预解析
	//		预解析：在当前作用域下,js运行之前，会把带有var和function关键字的事先声明，并在内存中安排好。然后再从上到下执行js语句。
	//预解析只会发生在通过var定义的变量和function上。
	//		只要是通过var定义的，不管是变量，还是函数，都是先赋值undefined，如果是变量，也不管变量有没有赋值，在预解析阶段，都是会被赋值为undefined。
	document.write('一. 变量提升，预解析<br>')
	var tmp = new Date()

	function f() {
		console.log(tmp)
		var tmp = 123
		console.log(tmp)
		//			if(true){
		//				console.log(111)
		//				var tmp='hello'
		//			}	
	}
	f()
	// 二.数字相加到最后个位数(数字=>字符串=>数组相加)
	document.write('二. 数字相加到最后个位数<br>')
	let str = 9999933

	function sumString(val) {
		var strArr = val.toString().split('')
		// var sumStrArr = 0;
		// strArr.map(a => {
		// 	sumStrArr += Number(a)
		// })
		let sumStrArr = strArr.reduce((prev,cur,index,array)=>{
			return Number(prev) + Number(cur)
		})
		// console.log(sumStrArr)
		if (sumStrArr >= 10) {
			sumString(sumStrArr)
		} else {
			document.write('数字相加到最后个位：' + sumStrArr + '<br>')
		}
	}
	sumString(str)
	// 三.递归算法
	document.write('三. 递归算法<br>')
	var recursionIndex = 0;

	function recursion() {
		document.write(recursionIndex + '<br>')
		if (recursionIndex < 3) {
			recursionIndex++;
			recursion()
		}
	}
	recursion(recursionIndex)
	// 四.null与undefined
	document.write('四. null与undefined<br>')
	document.write('underfined得值派生自null得值,null是一个表示"无"的对象，转为数值时为0；undefined是一个表示"无"的原始值，转为数值时为NaN。' + '<br>')
	let flag = null == undefined
	document.write('(null == undefined) ====>' + flag + '<br>')

	let flag1 = 5 + null
	document.write('5+null====>' + flag1 + '<br>')
	let flag2 = 5 + undefined
	document.write('5+undefined====>' + flag2 + '<br>')

	let flag3 = typeof (null)
	document.write('typeof(null)====>' + flag3 + '<br>')
	let flag4 = typeof (undefined)
	document.write('typeof(undefined)====>' + flag4 + '<br>')
	// 五.Boolean
	document.write('五.boolean<br>')
	document.write('非空字符串====>' + Boolean('string') + '<br>')
	document.write('空字符串====>' + Boolean('') + '<br>')
	document.write('非零数字值（包括无穷大）====>' + Boolean(88) + '<br>')
	document.write('0和 NaN====>' + Boolean(NaN) + '<br>')
	document.write('任何对象====>' + Boolean({}) + '<br>')
	document.write('null====>' + Boolean(null) + '<br>')
	document.write('undefined====>' + Boolean(undefined) + '<br>')
	//六.isNaN
	document.write('六.isNan<br>')
	document.write('isNaN() 在接收到一个值之后，会尝试将这个值转换为数值。某些不是数值的值会直接转换为数值，例如字符串 "10" 或 Boolean 值。而任何不能被转换为数值的值都会导致这个函数返回 true 。' +
		'<br>')
	document.write('isNaN(NaN)====>' + isNaN(NaN) + '<br>'); //true
	document.write('isNaN(10)====>' + isNaN(10) + '<br>'); //false（10 是一个数值）
	document.write('isNaN(“10”)====>' + isNaN("10") + '<br>'); //false（可以被转换成数值 10）
	document.write('isNaN(“blue”)====>' + isNaN("blue") + '<br>'); //true（不能转换成数值）
	document.write('isNaN(true)====>' + isNaN(true) + '<br>'); //false（可以被转换成数值 1）
	document.write('isNaN({})====>' + isNaN({}) + '<br>'); //false（可以被转换成数值 1）
	//七.Number,parseInt,parseFloat
	document.write('七.Number(),parseInt(),parseFloat()<br>')
	document.write('Number("Hello world!")====>' + Number("Hello world!") + '<br>');
	document.write('Number("")====>' + Number("") + '<br>');
	document.write('Number("000011")====>' + Number("000011") + '<br>');
	document.write('Number(true)====>' + Number(true) + '<br>');
	document.write('parseInt("1234blue")====>' + parseInt('1234blue') + '<br>');
	document.write('parseInt("")====>' + parseInt('') + '<br>');
	document.write('parseInt("0xA")====>' + parseInt('0xA') + '<br>'); // 10（十六进制数）
	document.write('parseInt("0xf")====>' + parseInt('0xf') + '<br>'); //15（十六进制数）
	document.write('parseInt(22.5)====>' + parseInt(22.5) + '<br>');
	document.write('parseFloat("1234blue")====>' + parseFloat("1234blue") + '<br>');
	document.write('parseFloat("0xA")====>' + parseFloat("0xA") + '<br>');
	document.write('parseFloat("22.5")====>' + parseFloat("22.5") + '<br>');
	document.write('parseFloat("22.34.5")====>' + parseFloat("22.34.5") + '<br>');
	document.write('parseFloat("0908.5")====>' + parseFloat("0908.5") + '<br>');
	document.write('parseFloat("3.125e7")====>' + parseFloat("3.125e7") + '<br>');
	// 八.String
	document.write('八.String<br>')
	document.write('String(10)====>' + String(10) + '<br>');
	document.write('String(true)====>' + String(true) + '<br>');
	document.write('String(null)====>' + String(null) + '<br>');
	document.write('String(undefined)====>' + String(undefined) + '<br>');
	var numString = 10;
	document.write('numString.toString()====>' + numString.toString() + '<br>');
	document.write('numString.toString(2)====>' + numString.toString(2) + '<br>');
	document.write('numString.toString(8)====>' + numString.toString(8) + '<br>');
	document.write('numString.toString(16)====>' + numString.toString(16) + '<br>');

	// 九.基本数据类型和引用数据类型
	document.write('九.基本数据类型和引用数据类型<br>')
	document.write('基本数据类型：基本类型值指的是简单的数据段<br>')
	document.write('引用数据类型：引用类型值指的是那些可能由多个值构成的对象，引用数据类型得值是保存在内存中的对象。引用类型的值是按引用访问的<br>')
	//十.重排序方法
	document.write('十.重排序方法<br>')

	function compare1(value1, value2) {
		if (value1 < value2) {
			return -1;
		} else if (value1 > value2) {
			return 1;
		} else {
			return 0;
		}
	}
	function compare2(value1, value2) {
		if (value1 < value2) {
			return 1;
		} else if (value1 > value2) {
			return -1;
		} else {
			return 0;
		}
	}
	let sortArr = [2,3,5,12,7,1,4]
	sortArr.reverse()
	document.write('倒序：'+sortArr+'<br>')
	sortArr.sort(compare1)
	document.write('从小到大：'+sortArr+'<br>')//从小到大
	sortArr.sort(compare2)
	document.write('从大到小：'+sortArr+'<br>')//从大到小
</script>

</html>